home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / pascal / inline22.zip / FLPT.INC next >
Text File  |  1987-09-27  |  6KB  |  211 lines

  1.                          {FLPT5}
  2. {-------------DoEsc}
  3. PROCEDURE DoEsc(Pk : Packet);        {do the esc instr}
  4. begin
  5. if Wait_Found then
  6.   begin  InsrtSt(Instrnames[Opcodes[$9B]]); OutUstring; end;
  7. UsIndex:=FirstTab;
  8. InsrtSt('ESC'); UsIndex:=SecondTab;
  9. Insrthx2((Opcode and 7)*8+Reg);
  10. Comma; DoMem(Pk);
  11. end;
  12.  
  13. {-------------St_i}
  14. PROCEDURE St_i;         {do st(i) }
  15. begin
  16. InsrtSt('ST(');
  17. InsrtChr(Chr(Rm+$30));
  18. InsrtChr(')');
  19. end;
  20.  
  21. {-------------Sti_st}
  22. PROCEDURE Sti_st;       {do st(i),st }
  23. begin
  24. St_i;
  25. InsrtSt(',ST');
  26. end;
  27.  
  28. {-------------Db}
  29. PROCEDURE Db;
  30. Const DB_NAME :Array[0..11] of String[6] =
  31.            ('FILD','','FIST','FISTP','','FLD','',
  32.             'FSTP','FENI','FDISI','FCLEX','FINIT');
  33. Var     I       :Word;
  34.         Pk : Packet;
  35.         Tmp : String[7];
  36. begin
  37. ReadModeByte(Pk); Wd:=False;
  38. if (Mode=3) then I:=Rm+8 else I:=Reg;   {form an index}
  39. Tmp:=DB_NAME[I];
  40. if (Tmp[0]>#0) and (I<=11) then
  41.    begin
  42.    if not Wait_Found then
  43.      if I>=8 then  {'FENI','FDISI','FCLEX','FINIT' to no wait equivalents}
  44.        Insert('N',Tmp,2);
  45.    InsrtSt(Tmp); UsIndex:=SecondTab;
  46.    if I<=3 then
  47.       begin
  48.       InsrtSt('DWORD '); DoMem(Pk);
  49.       end
  50.    else if I<=7 then
  51.       begin InsrtSt('TBYTE '); DoMem(Pk); end;
  52.    end
  53. else DoEsc(Pk);
  54. end;
  55.  
  56. {-------------Dd}
  57. PROCEDURE Dd;
  58. Const DD_NAME :Array[0..11] of String[6] =
  59.              ('FLD','','FST','FSTP','FRSTOR',
  60.               '','FSAVE','FSTSW','FFREE','FXCH',
  61.               'FST','FSTP');
  62. Var     I       :Word;
  63.         Pk : Packet;
  64.         Tmp : String[7];
  65. begin
  66. ReadModeByte(Pk); Wd:=False;
  67. if Mode=3 then I:=Reg+8 else I:=Reg;
  68. Tmp:=DD_NAME[I];
  69. if (Tmp[0]>#0) and (I<=11) then
  70.    begin
  71.    if not Wait_Found then
  72.      if (I=6) or (I=7) then  {'FSAVE','FSTSW' to no wait equivalents}
  73.        Insert('N',Tmp,2);
  74.    InsrtSt(Tmp); UsIndex:=SecondTab;
  75.    if I<=3 then InsrtSt('QWORD ');
  76.    if I<=7 then DoMem(Pk)
  77.    else St_i;
  78.    end
  79. else DoEsc(Pk);
  80. end;
  81.  
  82. {-------------Df}
  83. PROCEDURE Df;
  84. Const DF_NAME :Array[0..11] of String[5] =
  85.               ('FILD','','FIST','FISTP','FBLD',
  86.                'FILD','FBSTP','FISTP','FFREE','FXCH',
  87.                'FST','FSTP');
  88. Var     I       :Word;
  89.         Pk : Packet;
  90. begin
  91. ReadModeByte(Pk); Wd:=False;
  92. if Mode=3 then I:=Reg+8 else I:=Reg;    {form index}
  93. if (I<>1) and (I<=11) then
  94.    begin
  95.    InsrtSt(DF_NAME[I]); UsIndex:=SecondTab;
  96.    if I<=3 then
  97.       begin InsrtSt('WORD '); DoMem(Pk); end
  98.    else if I<=7 then
  99.       begin
  100.       if (I and 5)=4 then InsrtSt('TBYTE ') else InsrtSt('QWORD ');
  101.       DoMem(Pk);
  102.       end
  103.    else St_i;
  104.    end
  105. else DoEsc(Pk);
  106. end;
  107.  
  108. {-------------D9}
  109. PROCEDURE D9;
  110. Const D9_NAME :Array[0..11] of String[6] =
  111.         ('FLD', '', 'FST', 'FSTP',
  112.          'FLDENV', 'FLDCW', 'FSTENV', 'FSTCW',
  113.          'FLD', 'FXCH', 'FNOP', 'FSTP');
  114.  
  115. Const D9_3_NAME :Array[0..29] of String[7] =
  116.        ('FCHS','FABS','','','FTST',
  117.         'FXAM','','','FLD1','FLDL2T',
  118.         'FLDL2E','FLDPI','FLDLG2','FLDLN2','FLDZ',
  119.         '','F2XM1','FYL2X','FPTAN','FPATAN',
  120.         'FXTRACT','','FDECSTP','FINCSTP','FPREM',
  121.         'FYL2XP1','FSQRT','','FRNDINT','FSCALE');
  122. Var     I       :Word;
  123.         Pk : Packet;
  124.         Tmp : String[7];
  125. begin
  126. ReadModeByte(Pk);
  127. Wd:=False;
  128. if (Mode<>3) or (Reg<=3) then
  129.    begin
  130.    if Mode=3 then I:=Reg+8 else I:=Reg;
  131.    if (I=1) or ((I=10) and (Rm<>0)) then DoEsc(Pk)
  132.    else
  133.       begin
  134.       Tmp:=D9_NAME[I];
  135.       if not Wait_Found then
  136.         if (I=6) or (I=7) then  {'FSTENV', 'FSTCW' to no wait equivalents}
  137.           Insert('N',Tmp,2);
  138.       InsrtSt(Tmp);  UsIndex:=SecondTab;
  139.       if I<=3 then InsrtSt('DWORD ');
  140.       if I<=7 then DoMem(Pk)
  141.       else if I<>10 then        {fnop is 10}
  142.          St_i;  {st(i)}
  143.       end;
  144.    end
  145. else
  146.    begin        {mode=3 and reg>=4}
  147.    I:=Rm+(Reg and 3)*8; {include lower 2 bits of reg in index}
  148.    if (D9_3_NAME[I][0]>#0) and (I<=29) then
  149.       InsrtSt(D9_3_NAME[I])
  150.    else DoEsc(Pk);
  151.    end;
  152. end;
  153.  
  154. {-------------D8_dc}
  155. PROCEDURE D8_dc;
  156. Type    Nametype=Array[0..7] of Array[1..5] of Char;
  157. Var     Shortreal       :Boolean;
  158.         Pk : Packet;
  159. Const   D8_dc_name : Nametype =(
  160.           'FADD ','FMUL ','FCOM ','FCOMP','FSUB ','FSUBR','FDIV ','FDIVR');
  161. begin
  162. Wd:=False;
  163. Shortreal:=Opcode=$D8;
  164. ReadModeByte(Pk);
  165. if not Shortreal then if (Reg>=6) then {fdiv, fdivr are reversed here}
  166.    Reg:=Reg Xor 1;
  167. InsrtSt(D8_dc_name[Reg]);
  168. UsIndex:=SecondTab;
  169. if Mode<>3 then
  170.    begin
  171.    if Shortreal then InsrtSt('DWORD ') else InsrtSt('QWORD ');
  172.    DoMem(Pk);
  173.    end
  174. else  {mode=3}
  175.    if Shortreal then
  176.       begin InsrtSt('ST,'); St_i; end
  177.    else Sti_st;                 {add the stack info}
  178. end;
  179.  
  180. {-------------Da_de}
  181. PROCEDURE Da_de;
  182. Type    Nametype=Array[0..15] of Array[1..6] of Char;
  183. Var     Shortint        :Boolean;
  184.         Pk : Packet;
  185. Const   Da_de_name : Nametype = (
  186.         'FIADD ','FIMUL ','FICOM ','FICOMP','FISUB ','FISUBR','FIDIV ',
  187.         'FIDIVR','FADDP ','FMULP ','FCOMP ','FCOMPP','FSUBRP','FSUBP ',
  188.         'FDIVRP','FDIVP ');
  189. begin
  190. Wd:=False;
  191. Shortint:=Opcode=$DA;
  192. ReadModeByte(Pk);
  193. if Mode<>3 then
  194.    begin
  195.    InsrtSt(Da_de_name[Reg]);
  196.    UsIndex:=SecondTab;
  197.    if Shortint then InsrtSt('DWORD ') else InsrtSt('WORD ');
  198.    DoMem(Pk);
  199.    end
  200. else
  201.    begin        {mode=3}
  202.    if Shortint or ((Reg=3) and (Rm<>1)) then DoEsc(Pk)      {not fl pt}
  203.    else
  204.       begin
  205.       InsrtSt(Da_de_name[Reg+8]);
  206.       UsIndex:=SecondTab;
  207.       if (Reg<>3) then Sti_st;
  208.       end;
  209.    end;
  210. end;
  211.